package com.八股文.动态代理.JDK动态代理;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

// 1. 定义目标接口
interface UserService {
    void addUser(String username);
    String getUser(String username);
}

// 2. 实现目标接口
class UserServiceImpl implements UserService {
    @Override
    public void addUser(String username) {
        System.out.println("添加用户：" + username);
    }

    @Override
    public String getUser(String username) {
        System.out.println("查询用户：" + username);
        return username;
    }
}

// 3. 实现InvocationHandler（增强逻辑）
class MyInvocationHandler implements InvocationHandler {
    // 目标对象（被代理的对象）
    private Object target;

    public MyInvocationHandler(Object target) {
        this.target = target;
    }

    // 代理对象的方法被调用时，会触发invoke方法
    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        // 前置增强（如日志记录）
        System.out.println("===== 方法调用前：" + method.getName() + "，参数：" + args[0] + " =====");

        // 调用目标对象的原始方法
        Object result = method.invoke(target, args);

        // 后置增强（如结果处理）
        System.out.println("===== 方法调用后：" + method.getName() + " =====");

        return result; // 返回原始方法的结果
    }
}

// 测试类
public class JdkProxyDemo {
    public static void main(String[] args) {
        // 目标对象
        UserService target = new UserServiceImpl();

        // 创建代理对象
        UserService proxy = (UserService) Proxy.newProxyInstance(
                target.getClass().getClassLoader(), // 类加载器
                target.getClass().getInterfaces(),  // 目标对象实现的接口
                new MyInvocationHandler(target)     // 增强逻辑处理器
        );

        // 调用代理对象的方法（实际会执行增强后的逻辑）
        System.out.println("原始对象的方法：");
        target.addUser("张三");
        System.out.println("代理对象（增强后的）的方法：");
        proxy.addUser("张三");
        System.out.println("-----");
        proxy.getUser("李四");
    }
}
